// src/store/index.js （完整代码，包含 Pinia 定义 + axios 配置）
import { defineStore } from "pinia";
import axios from "axios";

// 1. 配置 axios（前后端互通的核心：基础路径、请求头、拦截器）
axios.defaults.baseURL = "http://localhost:8080/"; // 你的后端接口前缀
axios.defaults.timeout = 5000;
axios.defaults.headers.post["Content-Type"] = "application/json";

// 2. 定义 Pinia 全局状态库（useGlobalStore 就是从这导出的）
export const useGlobalStore = defineStore("global", {
  // 存储全局数据（用户信息、加载状态、错误提示）
  state: () => ({
    userInfo: {
      userId: "", // 登录后存储员工ID
      username: "", // 登录后存储用户名
      role: "", // 登录后存储角色（employee/admin）
    },
    isLoading: false, // 全局加载状态（比如接口请求时显示“加载中”）
    errorMsg: "", // 全局错误提示（比如接口请求失败时显示）
  }),
  // 计算属性（简化组件中获取数据的逻辑）
  getters: {
    currentUserId: (state) => state.userInfo.userId, // 快速获取当前用户ID
    isAdmin: (state) => state.userInfo.role === "admin", // 快速判断是否是管理员
  },
  // 方法（修改全局状态的逻辑，组件中通过这个方法修改数据）
  actions: {
    // 设置加载状态
    setLoading(status) {
      this.isLoading = status;
    },
    // 设置错误提示（3秒后自动清除）
    setErrorMsg(msg) {
      this.errorMsg = msg;
      setTimeout(() => {
        this.errorMsg = "";
      }, 3000);
    },
    // 清空错误提示
    clearErrorMsg() {
      this.errorMsg = "";
    },
    // 登录成功后，存储用户信息到 Pinia
    loginSuccess(userData) {
      this.userInfo = userData; // userData 是后端返回的用户信息（含 userId、username 等）
    },
    // 退出登录，清空用户信息和本地 Token
    logout() {
      this.userInfo = { userId: "", username: "", role: "" };
      localStorage.removeItem("token"); // 清除登录凭证
    },
  },
});

// 3. axios 请求拦截器：所有请求自动携带 Token（登录后存储在本地）
axios.interceptors.request.use(
  (config) => {
    const token = localStorage.getItem("token"); // 从本地存储获取 Token
    if (token) {
      config.headers.Authorization = `Bearer ${token}`; // 后端需要通过 Token 验证身份
    }
    return config;
  },
  (error) => Promise.reject(error)
);

// 4. axios 响应拦截器：统一处理接口错误（比如 Token 过期、接口报错）
axios.interceptors.response.use(
  (response) => {
    const { code, msg, data } = response.data;
    if (code !== 200) {
      // 接口返回错误时，通过 Pinia 显示错误提示
      const globalStore = useGlobalStore();
      globalStore.setErrorMsg(msg || "请求失败");
      return Promise.reject(msg);
    }
    return data; // 接口成功时，直接返回数据（简化组件中获取数据的逻辑）
  },
  (error) => {
    // 网络错误（比如后端没启动）时，显示错误提示
    const globalStore = useGlobalStore();
    globalStore.setErrorMsg(error.message || "网络异常，请重试");
    return Promise.reject(error);
  }
);

// 导出 axios 和 useGlobalStore，供组件使用
export { axios };
